package com.eltsistemas.controller.funcionario;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.eltsistemas.controller.salarial.SalarialHistorico;
import com.eltsistemas.dao.AutorizacaoDao;
import com.eltsistemas.dao.GenericDao;
import com.eltsistemas.hibernate.HibernateUtil;
import com.eltsistemas.modelo.Autorizacao;
import com.eltsistemas.modelo.Autorizacao_Funcionario;
import com.eltsistemas.modelo.Funcao;
import com.eltsistemas.modelo.Funcionario;
import com.eltsistemas.modelo.Salarial;
import com.eltsistemas.modelo.Setor;
import com.eltsistemas.modelo.Usuario;

@Controller
@SessionAttributes(value="usuario_Logado")
@RequestMapping(value="/funcionario")
public class FuncionarioAutorizacao {
	
	@RequestMapping(value="/autorizacao")
	@ResponseBody
	public List<Autorizacao_Funcionario> exibe(Funcionario funcionario)
	{
		//Iniciando conexao a abrindo uma transacao
		Session session = new HibernateUtil().getSession();
		session.beginTransaction();
		
		GenericDao<Funcionario> daoFuncionario = new GenericDao<>(session, Funcionario.class);
		Funcionario f = daoFuncionario.findByName(funcionario.getNome());
		
		List<Autorizacao_Funcionario> aut_FuncionarioList_Aux = new ArrayList<>();
		
		AutorizacaoDao daoAutorizacao = new AutorizacaoDao(session);
		
		List<Autorizacao_Funcionario> aut_FuncionarioList = daoAutorizacao.autorizacao_FuncionarioList(f);
		for(Autorizacao_Funcionario aut_Funcionario : aut_FuncionarioList)
		{
			Autorizacao_Funcionario autorizacao_Funcionario = new Autorizacao_Funcionario();
			autorizacao_Funcionario.setData( aut_Funcionario.getData() );
			autorizacao_Funcionario.setDescricao( aut_Funcionario.getDescricao() );
			autorizacao_Funcionario.setAprovado( aut_Funcionario.isAprovado() );
			
			Usuario usuario = new Usuario();
			usuario.setLogin(aut_Funcionario.getUsuario().getLogin());
			
			autorizacao_Funcionario.setUsuario( usuario );
			aut_FuncionarioList_Aux.add(autorizacao_Funcionario);
		}
		
		//Finalizando conexao
		session.close();

		return aut_FuncionarioList_Aux;
	}
	
	@RequestMapping(value="aprovacao")
	public String aprovacao(String nomeFuncionario, Autorizacao autorizacao,
							@ModelAttribute("usuario_Logado") Usuario user) throws HibernateException, ParseException
	{
		//Iniciando conexao a abrindo uma transacao
		Session session = new HibernateUtil().getSession();
		session.beginTransaction();
		
		//Carrega o funcionario a partir do nome
		GenericDao<Funcionario> daoFuncionario = new GenericDao<Funcionario>(session, Funcionario.class);
		Funcionario funcionario = daoFuncionario.findByName(nomeFuncionario);
	
		//Incluindo a autorizacao
		Autorizacao_Funcionario aut_Funcionario = new Autorizacao_Funcionario();
		aut_Funcionario.setData(Calendar.getInstance());
		aut_Funcionario.setDescricao( autorizacao.getDescricao() );
		aut_Funcionario.setFuncionario(funcionario);
		aut_Funcionario.setNivel( user.getNivel_Autorizacao() );
		aut_Funcionario.setUsuario(user);
		
		if(autorizacao.isAprovado() == true)
		{
			/*
			 * Se o usuario for nivel=3, atualiza o atributo situacao do objeto funcionario
			 */
			if(user.getNivel_Autorizacao() == 3)
			{
				//Inclui o historico salarial
				SalarialHistorico historico_Salarial = new SalarialHistorico();
				
				GenericDao<Salarial> daoSalarial = new GenericDao<>(session, Salarial.class);
				
				//Carrega os objetos
				Funcao funcao = funcionario.getFuncao();
				Setor setor = funcionario.getSetor();
				
				//Salva o objeto na session
				session = daoSalarial.adiciona( historico_Salarial.guardar_Historico(funcionario, funcao, setor, funcionario.getDataAdmissao()) );
				
				//Altera a situcao do funcionario
				funcionario.setSituacao("Ativo");
				
				//Salva o objeto na session
				session = daoFuncionario.altera(funcionario);
			}
			
			aut_Funcionario.setAprovado(true);
		}
		else
		{
			funcionario.setSituacao("Cancelado");
		}
	
		GenericDao<Autorizacao_Funcionario> daoAut_Funcionario = new GenericDao<>(session, Autorizacao_Funcionario.class);
		
		/*Salvando objeto no session, comitando os dados no banco e
		 * finalizando a conexao
		*/
		session = daoAut_Funcionario.adiciona(aut_Funcionario);
		session.getTransaction().commit();
		session.close();
		
		return "redirect:lista";
		
	}

}
